﻿/*
	Name:GetGpsInfo.c
	Copyright:GPLV2
	Author:ChenJR
	Date: 2017/03/09
	Description:
	NMEA-0183协议是为了在不同的GPS（全球定位系统）导航设备中建立统一的BTCM（海事无线电技术委员会）标准，由美国国家海洋电子协会（NMEA-The National Marine Electronics Associa-tion）制定的一套通讯协议。GPS接收机根据NMEA-0183协议的标准规范，将位置、速度等信息通过串口传送到PC机、PDA等设备。

	NMEA-0183协议是GPS接收机应当遵守的标准协议，也是目前GPS接收机上使用最广泛的协议，大多数常见的GPS接收机、GPS数据处理软件、导航软件都遵守或者至少兼容这个协议。

	NMEA-0183协议定义的语句非常多，但是常用的或者说兼容性最广的语句只有$GPGGA、$GPGSA、$GPGSV、$GPRMC、$GPVTG、$GPGLL等。

	其中$GPRMC语句的格式如下：
		$GPRMC,024813.640,A,3158.4608,N,11848.3737,E,10.05,324.27,150706,,,A*50
	这里整条语句是一个文本行，行中以逗号“,”隔开各个字段，每个字段的大小（长度）不一，这里的示例只是一种可能，并不能认为字段的大小就如上述例句一样。

	字段0：$GPRMC，语句ID，表明该语句为Recommended Minimum Specific GPS/TRANSIT Data（RMC）推荐最小定位信息
	字段1：UTC时间，hhmmss.sss格式
	字段2：状态，A=定位，V=未定位
	字段3：纬度ddmm.mmmm，度分格式（前导位数不足则补0）
	字段4：纬度N（北纬）或S（南纬）
	字段5：经度dddmm.mmmm，度分格式（前导位数不足则补0）
	字段6：经度E（东经）或W（西经）
	字段7：速度，节，Knots
	字段8：方位角，度
	字段9：UTC日期，DDMMYY格式
	字段10：磁偏角，（000
	- 180）度（前导位数不足则补0）
	字段11：磁偏角方向，E=东W=西
	字段16：校验值

	这里，“*”为校验和识别符，其后面的两位数为校验和，代表了“$”和“*”之间所有字符（不包括这两个字符）的异或值的十六进制值。上面这条例句的校验和是十六进制的50，也就是十进制的80。

	提示：^运算符的作用是异或。将$和*之间所有的字符做^运算(第一个字符和第二个字符异或，结果再和第三个字符异或，依此类推)之后的值对65536取余后的结果，应该和*后面的两个十六进制数字的值相等，否则的话说明这条语句在传输中发生了错误。注意这个十六进制值中是会出现A-F的大写字母的。

	现在，你的程序要读入一系列GPS输出，其中包含$GPRMC，也包含其他语句。在数据的最后，有一行单独的
		END
	表示数据的结束。

	你的程序要从中找出$GPRMC语句，计算校验和，找出其中校验正确，并且字段2表示已定位的语句，从中计算出时间，换算成北京时间。一次数据中会包含多条$GPRMC语句，以最后一条语句得到的北京时间作为结果输出。

	你的程序一定会读到一条有效的$GPRMC语句。

	输入格式:
	多条GPS语句，每条均以回车换行结束。最后一行是END三个大写字母。

	输出格式：
	6位数时间，表达为：
	hh:mm:ss
	其中，hh是两位数的小时，不足两位时前面补0；mm是两位数的分钟，不足两位时前面补0；ss是两位数的秒，不足两位时前面补0。

	输入样例：
	$GPRMC,024813.640,A,3158.4608,N,11848.3737,E,10.05,324.27,150706,,,A*50
	END

	输出样例：
	10:48:13
*/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define _GPRMC_ "$GPRMC"




 struct GPS_GPMRC {
	char utctime[3];  //hour,minute,second
	int utcdate[3];  //year,month,day
	char located;
	float lat;
	char east;
	char north;
	float lon;
	float speed;
	float course;
	float variation;
	char vareast;
	int checksum;
	
	
	int csttime[3];
	int cstdate[3];
	
} gpsdata,gpsnow;

char *getdata(char *p ,char *datai){
	
	char *ret =datai;
	while((*datai++ = *p++) !=',');
	datai--;
	*datai='\0';
	
	return ret;
	//返回指向data的指针 
	
}
int chartohex(char *c){
	int hex=-1;
	if((*c>='0')&&(*c<='9'))
		hex=*c-'0';
	else if((*c>='a')&&(*c<='f'))
		hex=*c-'a'+10;
	else if((*c>='A')&&(*c<='F'))
		hex=*c-'A'+10;
	return hex;
}

int gethex(char* c){

	return chartohex(c)*16+chartohex(++c);
	
	
}
int getchksum(char *str){
	unsigned  int  checksum=0;
	unsigned int xor_=0;
	char *a=str;
	xor_= *str;
//	checksum=xor_;
//	while(*str != '*'){
//		xor_^= *str++ ;
//		checksum+=xor_; 
//		
//	}
	 int i,result;
 	for(result=a[0],i=1;a[i]!='*';i++)
 	{
  	result^=a[i];
 	}
//	checksum=xor_;
	checksum=result%65536;
//	printf("Checksum is 0x%x\n",checksum);
	return checksum;

	
}


void getcst(struct GPS_GPMRC* gpsdata ){
	
	gpsdata->csttime[0]=((gpsdata->utctime[0]+8)%24);
	gpsdata->csttime[1]=((gpsdata->utctime[1]));
	gpsdata->csttime[2]=((gpsdata->utctime[2]));
}



int main(){
	char p[100];
	char *s;
	while(1){
		s=&p[0];
		p[0]='\0';
		scanf("%s",s);

		if(strncmp(s,"END",3)==0){
		//	printf("\nHere!\n");
			break;
			}
			
	
		if(strncmp(s,_GPRMC_,6)!=0)
			continue;
			

		char data[10]={0};
		s=s+7;
		int i=0;
		for (;i<3;i++)
		gpsnow.utctime[i]=chartohex(&s[2*i])*10+chartohex(&s[2*i+1]);

		
//		printf("utctime= %02d:%02d:%02d\n",gpsnow.utctime[0],gpsnow.utctime[1],gpsnow.utctime[2]);
		while(*s++!=',');
		data[0]='\0';
		
		if( !(gpsnow.located=( (*getdata(s,data))=='A') ) )
			continue;
		// printf("located=%d\n",gpsnow.located);
		//s+=strlen(data)+1;
		data[0]='\0';
		while(*s++!='*');
		gpsnow.checksum=getchksum(p+1);
		if (gethex(s)==gpsnow.checksum){
		//	printf("Equals!\n");
			gpsdata=gpsnow;
		}
		
	}
	getcst(&gpsdata);
	printf("%02d:%02d:%02d",gpsdata.csttime[0],gpsdata.csttime[1],gpsdata.csttime[2]);
	
	return 0;
}
